
toDo:
1. Jobs/cronJobs (ok)
2. Ingress (ok)
3. Services (ok)
4. Авто пул-секрет, конфигмапа и секрет (+автонейминг)
5. Автоскейлинг - генерация (ok))
6. Custom-secret (type: secret )

Фичи:
1. Глобал - задать реджистри (ок)
2. Аннотации глобал + локал (ок)
4. Авто пул-секрет, конфигмапа и секрет (+автонейминг)
5. Автоскейлинг - генерация

[!] Ко вниманию:
1) Исхожу из того что все значения env должны быть в кавычках
2) Исхожу из того что imagePullSecrets - в единственном экземпляре
3) Исхожу из того что темплейты в проект будем подтягивать сабмодулями
   гита, валуесы под проект заполнять непосредственно в самом проекте
   (все настройки в одном файле (в пайплайне можно составлять 1 из нескольких и тд))
4) extraEnvs - идут в дополнение к конфигмапе или секрету
   в иных случаях следует использовать обычные envs, при наличии
   которых конфигмапы, секреты и extraEnvs игнорируются.
5) Исхожу из того что что чеки в _helpers правильно устанавливают
   наличие или отстутсвие глобальных переменных
6) Общее для джоб, деплойментов можно передать как:
  (Также попадают в некоторые секреты и конфигмапы)
items:
  - type: global
    annotations:
      foo: ""
      bar: ""
    containers:
      - envs:
          - name:
            value:
          - name:
            value:
        extraEnvs:
          - name:
            value:
    initContainers:
      - envs:
          - name:
            value:
        extraEnvs:
          - name:
            value:
7) Исхожу из того что авто-tls будет общим на чарт,
   в противном случае используйте именнованные

Пример запуска:
helm upgrade --install name ./helm \
--kubeconfig= \
--namespace= \


Генерация по умолчанию:
Шаблон:
items:
  - annotations:
    #  checksum/config:
    #  checksum/image:
    autoscaling:
      enabled:
      minReplicas: #default 1
      maxReplicas: #default 10
      targetCPUUtilizationPercentage: #default 50
      targetMemoryUtilizationPercentage: #default 30
    replicas:
    restartPolicy:
    ####################################################################################
    # Можем указать имеющийся (enabled+name),                                          #
    # создать новый (enabled+data или enabled+data+name),                              #
    # использовать старый (ищем {{.Chart.Name}}-dockerconfig-порядковыйНомер) (enabled)#
    # или не использовать вовсе (enabled: folse)                                       #
    # Ожидаем дату вида:                                                               #
    # data:                                                                            #
    #   login:                                                                         #
    #   password:                                                                      #
    #   registry:                                                                      #
    # Или целевое значение                                                             #
    # data:                                                                            #
    #   dockerconfigjson:                                                              #
    # Также в дате можно передать тип (default kubernetes.io/dockerconfigjson)         #
    # data:                                                                            #
    #   type                                                                           #
    ####################################################################################
    imagePullSecrets:
      enabled:
      data:
      name:
    #########################################################
    # Принемает "job", "deployment", "secret"(?), "service",#
    # "ingress", "configmap", "global", "cronjob"           #
    #########################################################
    type:
    ######################################################
    # Где надо, там используется. Пример: "0 23 * * *"   #
    ######################################################
    schedule:
    successfulJobsHistoryLimit:
    failedJobsHistoryLimit:
    concurrencyPolicy: #default Forbid
    # Нужен для ingress
    ######################################################
    # Если тип не ингресс с аннотациями                  #
    # И глобальные аннотации не проброшенны              #
    # annotations:                                       #
    #   kubernetes.io/ingress.class: "nginx"             #
    #   nginx.ingress.kubernetes.io/proxy-body-size: 50m #
    ######################################################
    rules: # Нужен для ingress
      - host: # auto = url
        http:
          paths:
            - path: # default "/"
              pathType: # default ImplementationSpecific
              backend:
                serviceName: # auto default .Chart.Name-service
                servicePort: # auto default 300{index}
    #################################################################
    # если data+enabled = новый секрет tls. name - задаст имя,      #
    # по умолчанию {{ .Chart.Name-secret-tls}}, enabled+name задать #
    # существующий. в data ищем crt и key, опционально              #
    # annotations и type. Если не находим crt и key                 #
    # вставляем data как есть, тип при этом kubernetes.io/tls.      #
    # Если находим crt и key - они кодируются base64 сами           #
    #################################################################
    tls: #для ingress (в тч для авто)
      annotations:
      enabled:
      data:
      name:
    #################################################################
    # С type service переносит значения в сервис как есть           #
    # Возможна путанница с ports в блоках ниже, но                  #
    # для читабильности, считаю нужным оставить так                 #
    #################################################################
    services:
      - type: # default ClusterIP
        ports:
        selector: # required
    volumes:
    strategy:
    containers:
      - command:
        args:
        name:
        livenessProbe:
        readinessProbe:
        ######################################################################
        # Можем указать имеющуюся(enabled+name), создать новую(enabled+data),#
        # использовать старую(ищем {{.Chart.Name}}-config)(enabled)          #
        # или не использовать вовсе                                          #
        ######################################################################
        configMap:
          enabled:
          name:
          data:
        ######################################################################
        # Использовать если нет ни конфигмапы ни секрета                     #
        # Или нужно переопределить их                                        #
        ######################################################################
        envs:
        # - name:
        #   value:
        ############################################################################
        # Использовать когда заданы конфигмапа и/или секрет для проброса переменных#
        # в дополнение к ним                                                       #
        ############################################################################
        extraEnvs:
        # - name:
        #   value:
        ######################################################################
        # Тут ожидается containerPort и path для авто-сервиса,               #
        # можно передать и pathType                                          #
        ######################################################################
        ports:
        ######################################################################
        # А тут ресурсы                                                      #
        ######################################################################
        resources:
        ######################################################################
        # Реджистри откуда тянем имеджи                                      #
        ######################################################################
        registry:
        ######################################################################
        # Можем указать имеющуюся(enabled+name), создать новую(enabled+data),#
        # использовать старую(ищем {{.Chart.Name}}-secret)(enabled)          #
        # или не использовать вовсе                                          #
        ######################################################################
        secret:
          enabled:
          name:
          data:
        image:
        imageTag:
        imagePullPolicy:
        volumeMounts:
        #################################################################
        # Используй url для авто-ингресса + авто-сервиса                #
        # Для них также обязателен containers.ports.containerPort,      #
        # Он же будет равен targetPort для сервиса.                     #
        # При автогенирации "path" берём из ports контейнера.           #
        # (Обрабатывается при гинерации отдельно. По умолчанию в ports  #
        # даёт анвалидейт.) По умолчанию равен "/".                     #
        #                                                               #
        # Совмещение type "ingress" и url не тестировалось.             #
        #################################################################
        #Пример автогенирации:                                          #
        #- host: exsmple.example                                        #
        #  http:                                                        #
        #    paths:                                                     #
        #    - backend:                                                 #
        #        serviceName: example-service                           #
        #        servicePort: 3001                                      #
        #      path: /                                                  #
        #      pathType: ImplementationSpecific                         #
        #                                                               #
        #################################################################
        url: #для auto ingress (см выше дефаулты для auto)
    initContainers:
      - args:
        command:
        configMap:
          enabled:
          name:
          data:
        envs:
        extraEnvs:
        image:
        imageTag:
        imagePullPolicy:
        name:
        resources:
        registry:
        secret:
          enabled:
          name:
          data:
        volumeMounts:
